package cn.lili.modules.goods_auth.serviceImpl;

import cn.lili.common.utils.RSAPCIUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods_auth.mapper.GoodsAuthMapper;
import cn.lili.modules.goods_auth.service.GoodsAuthService;
import cn.lili.modules.system.entity.dos.LiAuth;
import cn.lili.modules.system.entity.dto.GoodsAuthSearchParams;
import cn.lili.modules.system.entity.enums.AuthTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.security.KeyPair;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 *后台商品授权管理接口实现
 */
@Service
public class GoodsAuthServiceImpl extends ServiceImpl<GoodsAuthMapper, LiAuth> implements GoodsAuthService {

    /**
     * 授权分页查询
     * @param searchParams 查询条件
     * @return 返回结果
     * */
    @Override
    public Page<LiAuth> authPage(GoodsAuthSearchParams searchParams) {
        return this.page(new Page<>(searchParams.getPageNumber(), searchParams.getPageSize()), searchParams.wrapper());
    }

    /**
     * 授权分页列表
     *
     * @return 返回结果
     * */
    @Override
    public List<LiAuth> getList() {
        LambdaQueryWrapper<LiAuth> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(LiAuth::getType,AuthTypeEnum.NORMAL.getCode());
        queryWrapper.eq(LiAuth::getDeleteFlag,false);
        return this.list(queryWrapper);
    }

    /**
     * 生成APPID，私钥，公钥
     *
     * @return 返回结果
     * */
    @Override
    public LiAuth generateAppid() {
        try {
            //获取加密串
            KeyPair keyPair = RSAPCIUtil.generateKeyPair();
            String publicKey = RSAPCIUtil.byte2Hex(keyPair.getPublic().getEncoded());
            String privateKey = RSAPCIUtil.byte2Hex(keyPair.getPrivate().getEncoded());

            //返回结果
            return LiAuth.builder()
                    .appid(UUID.randomUUID().toString())
                    .publicKey(publicKey)
                    .privateKey(privateKey)
                    .build();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 添加授权
     * @param liAuth 授权对象
     * @return 返回结果
     * */
    @Override
    public Boolean addLiAuth(LiAuth liAuth) {
        //空值校验
        liAuth.notNull();
        //新增授权
        liAuth.setOpenTime(new Date());
        liAuth.setType(AuthTypeEnum.NORMAL.getCode());
        //新增授权
        return super.save(liAuth);
    }

    /**
     * 修改授权
     * @param liAuth 授权对象
     * @return 返回结果
     * */
    @Override
    public Boolean updateAuth(LiAuth liAuth) {
        //空值校验
        liAuth.notNull();
        return this.updateById(liAuth);
    }

    /**
     * 冻结授权
     * @param id 授权ID
     * @return 返回结果
     * */
    @Override
    public Boolean freeze(String id) {
        LambdaUpdateWrapper<LiAuth>wrapper=new LambdaUpdateWrapper<>();
        wrapper.eq(LiAuth::getId,id)
                .set(LiAuth::getType,AuthTypeEnum.FREEZE.getCode())
                .set(LiAuth::getUpdateTime,new Date());
        return this.update(wrapper);
    }

    /**
     * 解冻授权
     * @param id 解冻ID
     * @return 返回结果
     * */
    @Override
    public Boolean unFreeze(String id) {
        LambdaUpdateWrapper<LiAuth>wrapper=new LambdaUpdateWrapper<>();
        wrapper.eq(LiAuth::getId,id)
                .set(LiAuth::getType,1);
        return this.update(wrapper);
    }

    /**
     * 根据 appid 获取授权配置信息
     *
     * @param appid 应用 ID
     * @return 授权配置信息
     */
    @Override
    public LiAuth getLiAuthByAppid(String appid) {
        LambdaQueryWrapper<LiAuth> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(LiAuth::getAppid,appid);
        lambdaQueryWrapper.eq(LiAuth::getDeleteFlag, 0);
        return this.getOne(lambdaQueryWrapper);
    }
}
